package com.nxg.pm04.baseAdpater;

import android.app.Activity;
import android.graphics.Color;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.speech.tts.TextToSpeech;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;

import com.nxg.pm04.R;
import com.nxg.pm04.util.ReflushStateListener;
import com.nxg.pm04.util.URLDTO;

import org.json.JSONArray;
import org.json.JSONObject;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class PMBaseAdapter extends BaseAdapter {
    Activity activity;//Activity是一个应用程序组件，提供一个屏幕，用户可以用来交互为了完成某项任务
    JSONArray jsonArray;//JSON格式的数组，一个final类,继承了Object，实现了JSON接口
    String date;
    //刷新监听器
    ReflushStateListener reflushStateListener;
    /**
     * 有参构造方法
     * @param activity 主活动界面？？
     * @param jsonArray JSON数组
     * @param date 字符日期？？？
     * @param reflushStateListener 刷新监听器
     */
    public PMBaseAdapter(Activity activity, JSONArray jsonArray,String date, ReflushStateListener reflushStateListener) {
        this.activity = activity;
        this.jsonArray = jsonArray;
        this.date = date;
        this.reflushStateListener = reflushStateListener;
    }
    //注意Handler导包， import android.os.Handler;
    private  Handler handler = new Handler(Looper.myLooper()){
        @Override
        public void handleMessage(@NonNull Message msg) {
            //msg.what 消息的id
            switch (msg.what){
                case 1:{
                    //用于向用户提示即时消息，它显示在应用程序界面的最上层，
                    // 显示一段时间后自动消失不会打断当前操作，也不获得焦点
                    //如果在Activity中使用的话，那么该参数可设置为"Activity.this",
                    //Toast.makeText("使用的方式，如在Activity中使用","提示内容","提示时间").show();
                    Toast.makeText(activity,date+"",Toast.LENGTH_SHORT).show();
                    //接口又没实现什么，只传一个参数，起什么作用？起到刷新的作用
                    reflushStateListener.reflush(1);
                    break;
                }
                case 2:{
                    try{

                    }catch (Exception ex){
                        //当前的PMBaseAdapter适配类，不保存数据
                        PMBaseAdapter.this.notifyDataSetChanged();
                    }

                }
            }
        }
    };
    /**
     * 数据的大小
     * @return
     */
    @Override
    public int getCount() {
        return jsonArray.length();
    }
    //返回当前position位置的Item
    @Override
    public Object getItem(int position) {
        return null;
    }
    //返回当前position位置的Item的ID
    @Override
    public long getItemId(int position) {
        return 0;
    }
    /**
     * 处理view和data填充数据的一个过程
     * @param position  被final修饰  int i ，从0开始
     * @param convertView
     * @param parent
     * @return
     */
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //在实际开发中LayoutInflater这个类还是非常有用的，它的作用类似于findViewById()。
        // 不同点是LayoutInflater是用来找res/layout/下的xml布局文件
        //一个没有被载入或者想要动态载入的界面，都需要使用LayoutInflater.inflate()来载入
        convertView = LayoutInflater.from(activity).inflate(R.layout.listpm,null);
        try {
           //转换为JSONObject类型，
           JSONObject obj  = (JSONObject)jsonArray.get(position);
           //findViewById() 是找具体 xml 布局文件中的具体 widget 控件(如:Button、TextView 等)。
           TextView tv01 =  convertView.findViewById(R.id.tv01);
           TextView tv02 =  convertView.findViewById(R.id.tv02);
           TextView tv03 =  convertView.findViewById(R.id.tv03);
            //复选框？？？
           final CheckBox checkBox =  convertView.findViewById(R.id.checkBox);
            //向listpm.xml界面中tv0中添加相应的数据，
           tv01.setText(obj.get("AssetName").toString()+" SN:"+obj.get("AssetSN").toString());
            //在此处设置类型值
           tv02.setText(obj.get("TaskName").toString());
            //判断任务状态， true表示任务已经被处理
           if(obj.get("TaskDone").toString().equals("true")){
               //复选框被设置为true
               checkBox.setChecked(true);
           }
            //1.    判断类型，
           if(obj.get("PMScheduleType").toString().equals("By Milage")){
               //tv03.setText("Milage "+"- at "+obj.get("ScheduleKilometer")+" kilometer");
               //1.1 判断其状态，然后设置相应的背景颜色
               tv03.setText("Milage - at "+obj.get("ScheduleKilometer").toString()+" Kilometer");
               if(obj.get("TaskDone").toString().equals("true")){
                   //基于运行的活动任务，已处理为灰色
                   convertView.setBackgroundColor(Color.GRAY);
               }else {
                   //未处理 为黑色
                   convertView.setBackgroundColor(Color.BLACK);
                   setBackgroundColor(tv01,tv02,tv03,checkBox);
               }
           }else {
               //SimpleDateFormat一种简单的格式, 构造时需要传入指定的参数,
               // 包含参数名称和格式, 以匹配需要解析的字符串;
               Calendar calendar = new GregorianCalendar();

               SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
               //活跃日期（当前日期）
               Date df1 = sdf.parse(date);
               calendar.setTime(df1);
               //活跃日期 + 四天
               calendar.add(Calendar.DATE,4);
               //未来4天
               Date date1 = calendar.getTime();
               //计划日期
               Date df2;
               //由于json中的数据中的 ScheduleDate可能为空，如果为空，则不能直接对日期进行转换，否则会报 空指针异常
               try{
                   if(obj.get("ScheduleDate").toString()!="" || obj.get("ScheduleDate").toString()!= null){
                       df2 = sdf.parse(obj.get("ScheduleDate").toString());

                       String scheduleDate = obj.get("ScheduleDate").toString().substring(0,10);
                       tv03.setText("Date - at "+scheduleDate);
                       if(df2.getTime() < df1.getTime() && obj.get("TaskDone").toString().equals("true")){
                           //已过期，已处理  橙色
                           convertView.setBackgroundColor(Color.parseColor("#FF8300"));
                       }else if(df2.getTime()<df1.getTime() && obj.get("TaskDone").toString().equals("false")){
                           //已过期，未处理  红色
                           convertView.setBackgroundColor(Color.RED);
                       }else if(df2.equals(df1) && obj.get("TaskDone").equals("true")){
                           //当天过期，已处理 绿色
                           convertView.setBackgroundColor(Color.GREEN);
                       }else if(df2.equals(df1) && obj.get("TaskDone").equals("false")){
                           //当天过期，未处理  黑色
                           convertView.setBackgroundColor(Color.BLACK);
                       }else if(df2.getTime()>df1.getTime() && df2.getTime() <= date1.getTime() && obj.get("TaskDone").toString().equals("true")){
                           //未过期，已处理 黑色
                           convertView.setBackgroundColor(Color.BLACK);
                       }else if(df2.getTime()>df1.getTime()&& df2.getTime() <= date1.getTime() && obj.get("TaskDone").toString().equals("false")){
                           //未过期，未处理  紫色
                           convertView.setBackgroundColor(Color.MAGENTA);
                       }
                   }else {
                       df2=null;
                   }
               }catch (Exception e){
                   //e.printStackTrace();
                   df2 = null;
               }
           }

            //对复选框按钮设置id   （数值类型） 转换为整型
           checkBox.setId(obj.getInt("PMID"));
            //对复选框设置点击监听事件
           checkBox.setOnClickListener(new View.OnClickListener() {
               @Override
               public void onClick(View v) {
                   //判断是否被选中
                   boolean isTaskDone = checkBox.isChecked();
                    // 设置页面 提示内容
                   Toast.makeText(activity,isTaskDone+"",Toast.LENGTH_SHORT).show();
                   //获取复选框按钮
                   int id = checkBox.getId();
                   Toast.makeText(activity,id+"",Toast.LENGTH_SHORT).show();
                   URLDTO.updateIsTaskDone(id,isTaskDone,handler);
               }
           });


        }catch (Exception e){
            e.printStackTrace();
        }
        //返回视图
        return convertView;
    }

    //@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    private void setBackgroundColor(TextView tv01, TextView tv02, TextView tv03, CheckBox checkBox) {
        //设置文本框中文字 颜色 为白色
        tv01.setTextColor(Color.WHITE);
        tv02.setTextColor(Color.WHITE);
        tv03.setTextColor(Color.WHITE);
        //方式1,直接对复选框设置颜色 白色
        checkBox.setBackgroundColor(Color.WHITE);
        //方式2， 使用按钮方式设置复选框颜色
        // 提示需要 写一个注解
        //checkBox.setButtonTintList(ColorStateList.valueOf(Color.WHITE));
    }
}
